package com.rookie.tool.module.util.excel.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.CellExtra;
import com.rookie.tool.module.util.excel.callback.ExcelDataCallback;
import lombok.Setter;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * excel data 处理器
 *
 * @author rookie
 */
public class ExcelDataListener<T> extends AnalysisEventListener<T> {

    public ExcelDataListener(ExcelDataCallback<T> excelDataCallback) {
        this.excelDataCallback = excelDataCallback;
    }

    public ExcelDataListener(Integer maxDataSize, ExcelDataCallback<T> excelDataCallback) {
        this.maxDataSize = maxDataSize;
        this.excelDataCallback = excelDataCallback;
    }

    /**
     * 读取 n 条数据触发一次 overflowExecute
     */
    private Integer maxDataSize = 10;

    private final List<T> data = new LinkedList<>();

    /**
     * 读取触发的回调
     */
    private final ExcelDataCallback<T> excelDataCallback;

    /**
     * 每读取一条数据就会调用当前方法
     *
     * @param t               参数
     * @param analysisContext 分析器
     */
    @Override
    public void invoke(T t, AnalysisContext analysisContext) {
        if (maxDataSize == null || maxDataSize < 1) {
            throw new RuntimeException("maxDataSize 配置错误");
        }

        if (excelDataCallback == null) {
            throw new RuntimeException("ExcelDataCallback 配置错误");
        }
        data.add(t);
        if (data.size() >= maxDataSize) {
            excelDataCallback.overflowExecute(data);
            data.clear();
        }
    }

    /**
     * 读取完后会调用它
     *
     * @param analysisContext 分析器
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        excelDataCallback.finishExecute(data);
        data.clear();
    }

    /**
     * 读取表头
     *
     * @param headMap 表头
     * @param context 分析器
     */
    @Override
    public void invokeHead(Map<Integer, CellData> headMap, AnalysisContext context) {

    }

    /**
     * 读取额外信息
     *
     * @param extra   额外信息
     * @param context 分析器
     */
    @Override
    public void extra(CellExtra extra, AnalysisContext context) {

    }
}
